let a: Array<number> = [];
let a: Array<string | number> = [];

function foo(a: Array<Bar>): Array<Bar> {}
let xx: Array<Array<number>> = [[1, 2], [3]];
type Arr<T> = Array<T>;

function fooFunction(foo: Array<ArrayClass<string>>) {
  return foo.map(e => e.foo);
}

function bazFunction(baz: Arr<ArrayClass<String>>) {
  return baz.map(e => e.baz);
}

let fooVar: Array<(c: number) => number>;
type fooUnion = Array<string | number | boolean>;
type fooIntersection = Array<string & number>;
type Unwrap<T> = T extends Array<infer E> ? E : T;
